package JavaCode;

import java.util.ArrayList;
import java.util.Iterator;
import java.util.Random;

public class Ludus {

	private String id;
	private String name = "Rival";
	private int money = 3000;
	public ArrayList<Gladiador> gladiadores;
	public ArrayList<Arma> manoDer;
	public ArrayList<Arma> manoIzq;
	public ArrayList<Armadura> cascos;
	public ArrayList<Armadura> armaduras;
	private int entrenador = 1;
	private int medico = 1;
	private int nivelStr = 1;
	private int nivelDex = 1;
	private int nivelAgi = 1;
	private int nivelRes = 1;
	private int rooms = 3;
	private int rep = 0;
	private int nivelLudus = 1;

	public Ludus() {
		Random asd = new Random();
		this.id = String.valueOf(asd.nextInt(999999));
		gladiadores = new ArrayList<Gladiador>();
		manoDer = new ArrayList<Arma>();
		manoIzq = new ArrayList<Arma>();
		cascos = new ArrayList<Armadura>();
		armaduras = new ArrayList<Armadura>();
		for (int i = 0; i < 3; i++) {
			this.gladiadores.add(new Gladiador());
		}
	}

	public Ludus(String id, String name, String money, String entrenador,
			String medico, String nivelStr, String nivelDex, String nivelAgi,
			String nivelRes, String rooms, String rep, String nivelLudus,
			ArrayList<Gladiador> gladiadores) {
		this.id = id;
		this.name = name;
		this.money = Integer.parseInt(money);
		this.entrenador = Integer.parseInt(entrenador);
		this.medico = Integer.parseInt(medico);
		this.nivelStr = Integer.parseInt(nivelStr);
		this.nivelDex = Integer.parseInt(nivelDex);
		this.nivelAgi = Integer.parseInt(nivelAgi);
		this.nivelRes = Integer.parseInt(nivelRes);
		this.rooms = Integer.parseInt(rooms);
		this.rep = Integer.parseInt(rep);
		this.nivelLudus = Integer.parseInt(nivelLudus);
		setGladiadores(gladiadores);
		manoDer = new ArrayList<Arma>();
		manoIzq = new ArrayList<Arma>();
		cascos = new ArrayList<Armadura>();
		armaduras = new ArrayList<Armadura>();
	}

	public boolean contiene(Armadura casco) {
		Iterator<Armadura> it = cascos.iterator();
		while (it.hasNext()) {
			Armadura g = it.next();
			if (casco.getName() == g.getName())
				return true;
		}
		return false;
	}

	public void equiparMejoresArmas(Gladiador g) {
		Random asd = new Random();
		int aux = Math.max(
				g.getHabEsp1(),
				Math.max(
						g.getHabEsp1(),
						Math.max(g.getHabBlunt1(),
								Math.max(g.getHabSpear1(), g.getHabHand2()))));
		if (aux == g.getHabEsp1()) {
			if (asd.nextInt(8) == 0) {
				g.setRhand(Ciudad.getInstance().getArmas().get(3));
			} else
				g.setRhand(Ciudad.getInstance().getArmas().get(0));

		} else {
			if (aux == g.getHabHand2())
				g.setRhand(null);
			if (aux == g.getHabBlunt1())
				g.setRhand(Ciudad.getInstance().getArmas().get(2));
			if (aux == g.getHabSpear1())
				g.setRhand(Ciudad.getInstance().getArmas().get(1));
		}
		if (g.getAmbidex() + g.getHabEsc() >= 40) {
			g.setLhand(Ciudad.getInstance().getArmas().get(asd.nextInt(2) + 4));
		}
	}

	public void reequiparGladiadores() {
		Iterator<Gladiador> it = gladiadores.iterator();
		Random asd = new Random();
		while (it.hasNext()) {
			Gladiador g = it.next();
			if (asd.nextInt(3) == 1) {
				g.setHelm(Ciudad.getInstance().getCascos().get(asd.nextInt(3)));
			} else
				g.setHelm(null);
			if (asd.nextInt(2) == 1) {
				g.setArmor(Ciudad.getInstance().getArmaduras()
						.get(asd.nextInt(2)));
			} else
				g.setArmor(null);
			equiparMejoresArmas(g);
		}
	}

	public void asignarEntrenos() {
		Iterator<Gladiador> it = gladiadores.iterator();
		while (it.hasNext()) {
			Gladiador g = it.next();
			g.setEntrenamiento1(g.mejorEntreno1());
			g.setEntrenamiento2(g.mejorEntreno2());
		}
	}

	public void entrenamientoUSU(Entrenamiento e) {
		Iterator<Gladiador> it = gladiadores.iterator();
		while (it.hasNext()) {
			Gladiador g = it.next();
			e.entrenarUSU(g, nivelStr, nivelDex, nivelAgi, nivelRes,
					entrenador, medico);
		}
	}

	public void entrenamientoCPU() {
		Iterator<Gladiador> it = gladiadores.iterator();
		Entrenamiento e = new Entrenamiento();
		while (it.hasNext()) {
			Gladiador g = it.next();
			e.entrenarCPU(g, nivelStr, nivelDex, nivelAgi, nivelRes,
					entrenador, medico);
		}
	}

	public Gladiador getMaxvida() {
		Gladiador aux = null;
		Iterator<Gladiador> it = gladiadores.iterator();
		while (it.hasNext()) {
			Gladiador g = it.next();
			if (aux == null) {
				aux = g;
			} else if (g.getHp() > aux.getHp()) {
				aux = g;
			}

		}
		return aux;
	}

	public void muereGladiador(Gladiador g) {
		gladiadores.remove(g);
	}

	public void ganaDinero(int i) {
		money += i;
	}

	public void subirRep(int exp) {
		rep += exp;
		if (rep >= 1000 & rep < 2000 & nivelLudus < 2) {
			nivelLudus = 2;
		} else {
			if (rep >= 2000 & rep < 4000 & nivelLudus < 3) {
				nivelLudus = 3;
			} else {
				if (rep >= 4000 & rep < 7000 & nivelLudus < 4) {
					nivelLudus = 4;
				} else {
					if (rep >= 7000 & rep < 10000 & nivelLudus < 5) {
						nivelLudus = 5;
					} else {
						if (rep >= 10000 & rep < 14000 & nivelLudus < 6) {
							nivelLudus = 6;
						} else {
							if (rep >= 14000 & rep < 19000 & nivelLudus < 7) {
								nivelLudus = 7;
							} else {
								if (rep >= 19000 & rep < 28000 & nivelLudus < 8) {
									nivelLudus = 8;
								} else {
									if (rep >= 28000 & rep < 40000
											& nivelLudus < 9) {
										nivelLudus = 9;
									} else {
										if (rep >= 40000 & nivelLudus < 10) {
											nivelLudus = 10;
										}
									}
								}
							}
						}
					}
				}
			}
		}
	}

	public int calculaPrecioMejora(int nivel) {
		switch (nivel) {
		case 2:
			return 300;
		case 3:
			return 500;
		case 4:
			return 800;
		case 5:
			return 1200;
		case 6:
			return 1600;
		case 7:
			return 2000;
		case 8:
			return 2500;
		case 9:
			return 3500;
		case 10:
			return 5000;
		}
		return 0;
	}

	public boolean mejorarEntrenador() {
		if (entrenador == 10)
			return false;
		int x = calculaPrecioMejora(entrenador + 1);
		if (nivelLudus > entrenador & money >= x) {
			entrenador++;
			money -= x;
			return true;
		} else
			return false;
	}

	public boolean mejorarMedico() {
		if (medico == 10)
			return false;
		int x = calculaPrecioMejora(medico + 1);
		if (nivelLudus > medico & money >= x) {
			medico++;
			money -= x;
			return true;
		} else
			return false;
	}

	public boolean mejorarStr() {
		if (nivelStr == 10)
			return false;
		int x = calculaPrecioMejora(nivelStr + 1);
		if (nivelLudus > nivelStr & money >= x) {
			nivelStr++;
			money -= x;
			return true;
		} else
			return false;
	}

	public boolean mejorarDex() {
		if (nivelDex == 10)
			return false;
		int x = calculaPrecioMejora(nivelDex + 1);
		if (nivelLudus > nivelDex & money >= x) {
			nivelDex++;
			money -= x;
			return true;
		} else
			return false;
	}

	public boolean mejorarAgi() {
		if (nivelAgi == 10)
			return false;
		int x = calculaPrecioMejora(nivelAgi + 1);
		if (nivelLudus > nivelAgi & money >= x) {
			nivelAgi++;
			money -= x;
			return true;
		} else
			return false;
	}

	public boolean mejorarRes() {
		if (nivelRes == 10)
			return false;
		int x = calculaPrecioMejora(nivelRes + 1);
		if (nivelLudus > nivelRes & money >= x) {
			nivelRes++;
			money -= x;
			return true;
		} else
			return false;
	}

	public boolean ampliaRooms() {
		if (rooms < 8 & money >= 1000) {
			rooms++;
			money -= 1000;
			return true;
		} else
			return false;
	}

	public void compraMejorGladiador() {
		if (Ciudad.getMiInstanciaCiudad().getMercado().size() > 0) {
			Iterator<Gladiador> it = Ciudad.getMiInstanciaCiudad().getMercado()
					.iterator();
			int aux = 0;
			int i = 0;
			int j = 0;
			while (it.hasNext()) {
				Gladiador g = it.next();
				if (aux < g.getSumaFuzzys()) {
					aux = g.getSumaFuzzys();
					i = j;
				}
				j++;
			}
			Ciudad.getMiInstanciaCiudad()
					.getListaLudus()
					.get(1)
					.compraGladiador(
							Ciudad.getMiInstanciaCiudad().getMercado().get(i));
			Ciudad.getMiInstanciaCiudad().getListaLudus().get(1)
					.ganaDinero(-1000);
			Ciudad.getMiInstanciaCiudad().getMercado().remove(i);
		}
	}

	public String getId() {
		return id;
	}

	public void setId(String id) {
		this.id = id;
	}

	public String getName() {
		return name;
	}

	public void setName(String name) {
		this.name = name;
	}

	public int getMoney() {
		return money;
	}

	public void setMoney(int money) {
		this.money = money;
	}

	public void perdidas(int x) {
		this.money -= x;
	}

	public ArrayList<Gladiador> getGladiadores() {
		return gladiadores;
	}

	public void setGladiadores(ArrayList<Gladiador> gladiadores) {
		this.gladiadores = gladiadores;
	}

	public void compraGladiador(Gladiador glad) {
		this.gladiadores.add(glad);
	}

	public int getNivelStr() {
		return nivelStr;
	}

	public void setNivelStr(int nivelStr) {
		this.nivelStr = nivelStr;
	}

	public int getNivelDex() {
		return nivelDex;
	}

	public void setNivelDex(int nivelDex) {
		this.nivelDex = nivelDex;
	}

	public int getNivelAgi() {
		return nivelAgi;
	}

	public void setNivelAgi(int nivelAgi) {
		this.nivelAgi = nivelAgi;
	}

	public int getNivelRes() {
		return nivelRes;
	}

	public void setNivelRes(int nivelRes) {
		this.nivelRes = nivelRes;
	}

	public int getRooms() {
		return rooms;
	}

	public void setRooms(int rooms) {
		this.rooms = rooms;
	}

	public int getEntrenador() {
		return entrenador;
	}

	public void setEntrenador(int entrenador) {
		this.entrenador = entrenador;
	}

	public int getMedico() {
		return medico;
	}

	public void setMedico(int medico) {
		this.medico = medico;
	}

	public int getRep() {
		return rep;
	}

	public void setRep(int rep) {
		this.rep = rep;
	}

	public int getNivelLudus() {
		return nivelLudus;
	}

	public void setNivelLudus(int nivelLudus) {
		this.nivelLudus = nivelLudus;
	}

	public int numeroGladiadores() {
		return gladiadores.size();

	}

	public ArrayList<Arma> getManoDer() {
		return manoDer;
	}

	public void setManoDer(ArrayList<Arma> manoDer) {
		this.manoDer = manoDer;
	}

	public ArrayList<Arma> getManoIzq() {
		return manoIzq;
	}

	public void setManoIzq(ArrayList<Arma> manoIzq) {
		this.manoIzq = manoIzq;
	}

	public ArrayList<Armadura> getCascos() {
		return cascos;
	}

	public void setCascos(ArrayList<Armadura> cascos) {
		this.cascos = cascos;
	}

	public ArrayList<Armadura> getArmaduras() {
		return armaduras;
	}

	public void setArmaduras(ArrayList<Armadura> armaduras) {
		this.armaduras = armaduras;
	}

}
